package com.run2code.design.creational.builder.demo02;

/**
 * 链式调用建造者示例
 * 关注公众号【奔跑的码畜】，一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/11/20
 */
public class Student02Builder {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private int age;

    /**
     * 学生类的构造函数
     *
     * @param name 名字
     * @param age  年龄
     */
    private Student02Builder(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 构建器（本质上就是指挥者Commander）
     *
     * @return {@link StudentBuilder}
     */
    public static Student02Builder.StudentBuilder builder() {
        // 构造一个StudentBuilder对象
        return new Student02Builder.StudentBuilder();
    }

    /**
     * 学生构建器（相当于StudentBuilder及其实现类StudentActualBuilder）
     * 关注公众号【奔跑的码畜】，一起进步不迷路
     *
     * @author 第七人格
     * @date 2023/11/20
     */
    public static class StudentBuilder {
        private String name;
        private int age;

        StudentBuilder() {
        }

        public Student02Builder.StudentBuilder name(String name) {
            this.name = name;
            // 返回自身（StudentBuilder），以便链式调用
            return this;
        }

        public Student02Builder.StudentBuilder age(int age) {
            this.age = age;
            // 返回自身（StudentBuilder），以便链式调用
            return this;
        }

        /**
         * 构建
         *
         * @return {@link Student02Builder}
         */
        public Student02Builder build() {
            // 构造一个Student对象，其中的属性直接从外部传入
            return new Student02Builder(this.name, this.age);
        }

        @Override
        public String toString() {
            return "Student.StudentBuilder(name=" + this.name + ", age=" + this.age + ")";
        }
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
